﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Quartz.Impl;
using Quartz;
using System.Reflection;
using Autofac;
using Blog.Core.Domain.Model.User;
using Blog.Core.Api.HostServices;

namespace Blog.Core.Api.Controllers
{
	/// <summary>
	/// 定时任务
	/// </summary>
	[Route("api/[controller]")]
	[ApiController]
	public class TimesController : ControllerBase
	{
		[HttpGet("TestQuartz")]
		public async Task<IActionResult> TesQuartz()
		{
			//1. 创建一个调度器
			var scheduler = await new StdSchedulerFactory().GetScheduler();
			await scheduler.Start(); //启动
			//2. 创建一个工作任务
			var job = JobBuilder.Create<FirstJob>().Build();
			//3. 创建一个简单触发器
			//var trigger = TriggerBuilder.Create()
			// .WithSimpleSchedule(x =>
			// {
			//	 x.WithRepeatCount(3) //循环次数
			//	 .WithIntervalInSeconds(1);//间隔时间
			// }).Build();
			//3. 创建Cron触发器（Cron触发器比简单触发器更加强大）
			var trigger = TriggerBuilder.Create()
			.WithCronSchedule("* * * * * ? *")
			.Build();
			//将三个对象，连接在一起
			await scheduler.ScheduleJob(job, trigger);
			return Ok();

		}

		[HttpGet("TestReflection")]
		public IActionResult TestReflection(string typeName)
		{
			Type t=Assembly.Load("Blog.Core.Services").GetTypes().Where(x=>x.Name== typeName).FirstOrDefault();
			if (t == null)
			{
				return BadRequest();
			}

			//var list=t.GetProperties();//获取所有的属性
			//foreach (var item in list)
			//{
			//	Console.WriteLine("属性名：",item.Name);
			//}
			//todo:调查一项怎么获得类里面的构造函数名称和私有字段
			var list = t.GetDeclaredConstructors();//获取所有的字段

			foreach (var item in list)
			{
				Console.WriteLine("方法名：", item.Name);
			}
			List<string> names=list.Select(x=>x.Name).ToList();

			return Ok(names);
		}

		//用反射实现ORM的简单例子
		//输入一个类型的数据，能够自动转换成Sql(以下这个例子，做添加操作)
		[HttpPost("TestORM")]
		public IActionResult TestORM(Roles role)
		{
			//获取输入参数的类型Type
			Type t=role.GetType();
			//获取T里面的所有属性名称
			var props = t.GetProperties();
			//拼接SQL语句
			string strql = $"INSERT INTO {t.Name}s VALUES(";

			foreach(var p in props)
			{
				string strvalue=p.GetValue(role).ToString();
				strql += strvalue+",";
			}
			strql.TrimEnd(',');
			strql += ")";
			return Ok(strql);
		}
		//todo:有待研究
		[HttpPost("TestIOC")]
		public IActionResult TestIOC(string typeName)
		{
			//输入类型名称
			//输出一个对象(用动态)
			return Ok();
		}
	}
}
